// qrcode.js
export default class QRCode {
  constructor(options) {
    this.options = {
      size: 200, // 二维码大小
      colorDark: "#000000", // 深色模块颜色
      colorLight: "#ffffff", // 浅色模块颜色
      ...options,
    };
  }

  // 生成二维码并返回 canvas 的 base64 图像数据
  async generate(text) {
    return new Promise((resolve, reject) => {
      // 创建 canvas 元素
      const canvas = document.createElement("canvas");
      const ctx = canvas.getContext("2d");

      // 设置 canvas 大小
      canvas.width = this.options.size;
      canvas.height = this.options.size;

      // 将文本转换为二维码数据
      const qrData = this.encode(text);

      // 绘制二维码
      this.drawQRCode(ctx, qrData);

      // 转换为 base64 图像数据
      const base64 = canvas.toDataURL();
      resolve(base64);
    });
  }

  // 简单的二维码编码逻辑（仅支持小数据量，不支持复杂纠错）
  encode(text) {
    // 将文本转换为二进制数据
    const binaryData = [];
    for (let i = 0; i < text.length; i++) {
      const charCode = text.charCodeAt(i);
      const binaryString = charCode.toString(2).padStart(8, "0");
      binaryData.push(binaryString);
    }

    // 返回二维数组形式的二维码数据
    const qrData = [];
    let index = 0;
    const size = 20; // 假设二维码大小为 20x20
    for (let i = 0; i < size; i++) {
      qrData[i] = [];
      for (let j = 0; j < size; j++) {
        qrData[i][j] =
          binaryData[Math.floor(index / 8)][index % 8] === "1" ? 1 : 0;
        index++;
        if (index >= binaryData.join("").length) {
          break;
        }
      }
    }
    return qrData;
  }

  // 绘制二维码
  drawQRCode(ctx, qrData) {
    const size = this.options.size;
    const cellSize = size / qrData.length;

    for (let i = 0; i < qrData.length; i++) {
      for (let j = 0; j < qrData[i].length; j++) {
        const color =
          qrData[i][j] === 1 ? this.options.colorDark : this.options.colorLight;
        ctx.fillStyle = color;
        ctx.fillRect(j * cellSize, i * cellSize, cellSize, cellSize);
      }
    }
  }
}
